{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这个实例中，我们使用tensorflow来实现一个简单的手写数字识别的网络，并用这个网络来做个\n",
    "简单的识别示例。\n",
    "\n",
    "首先导入一些用到的库。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:50.515650Z",
     "start_time": "2018-06-01T06:32:43.133728Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\software\\install\\anaconda\\lib\\site-packages\\h5py\\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n",
      "  from ._conv import register_converters as _register_converters\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T05:39:48.304594Z",
     "start_time": "2018-06-01T04:55:17.674707Z"
    }
   },
   "source": [
    "先来看看数据长什么样子"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.075054Z",
     "start_time": "2018-06-01T06:32:50.518290Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-2-a34a30334354>:1: read_data_sets (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "WARNING:tensorflow:From D:\\software\\install\\anaconda\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:260: maybe_download (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please write your own downloading logic.\n",
      "WARNING:tensorflow:From D:\\software\\install\\anaconda\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:262: extract_images (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "WARNING:tensorflow:From D:\\software\\install\\anaconda\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:267: extract_labels (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From D:\\software\\install\\anaconda\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:110: dense_to_one_hot (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.one_hot on tensors.\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From D:\\software\\install\\anaconda\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "(55000, 784)\n",
      "(55000, 10)\n",
      "(5000, 784)\n",
      "(5000, 10)\n",
      "(10000, 784)\n",
      "(10000, 10)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"./\", one_hot=True)\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T05:49:40.128071Z",
     "start_time": "2018-06-01T05:49:40.123888Z"
    }
   },
   "source": [
    "可以看到images里面有数量不等的图片，每张图片是28x28长度的一个一维向量，\n",
    "所以用的时候需要先给它还原成28x28的二维图片。labels中则是图片对应的数字的值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.695746Z",
     "start_time": "2018-06-01T06:32:51.077167Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x247e8bdc940>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4, 4, idx + 1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(np.argmax(mnist.train.labels[idx])))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28, 28)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来，定义用于训练的网络，首先定义网络的输入。\n",
    "\n",
    "这里我们直接使用上面的数据作为输入，所以定义两个placeholder分别用于图像和lable数据，另外，定义一个bool类型的变量用于标识当前网络是否正在训练。\n",
    "\n",
    "为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，两个placeholder的第一个维度就是batchsize，因为我们这里还没有确定batchsize，所以第一个维度留空。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.706044Z",
     "start_time": "2018-06-01T06:32:51.698913Z"
    }
   },
   "outputs": [],
   "source": [
    "x = tf.placeholder(\"float\", [None, 784], name='x')\n",
    "y = tf.placeholder(\"float\", [None, 10], name='y')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "因为我们输入的是图片展开后的一维向量，所以第一步就需要先把一维向量还原为二维的图片。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.719298Z",
     "start_time": "2018-06-01T06:32:51.707730Z"
    }
   },
   "outputs": [],
   "source": [
    "x_image = tf.reshape(x, [-1, 28, 28, 1])   #-1代表维度未知"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:07:36.530623Z",
     "start_time": "2018-06-01T06:07:36.522665Z"
    }
   },
   "source": [
    "接下来，我们定义第一个卷积层，使用6个5X5的卷积核对输入数据进行卷积，\n",
    "padding方式选择valid，所以输出数据的宽高变为24x24,但是深度已经从原来的1变成了6。\n",
    "本层卷积的激活函数为relu。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.764292Z",
     "start_time": "2018-06-01T06:32:51.721295Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('conv1'):\n",
    "    C1 = tf.contrib.slim.conv2d(                  #slim方法\n",
    "        x_image, 6, [5, 5], padding='VALID', activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来进行stride为2的最大池化，池化后，输出深度不变，但是长宽减半，所以输出变成了12x12,深度6."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.774112Z",
     "start_time": "2018-06-01T06:32:51.766784Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('pool1'):\n",
    "    S2 = tf.contrib.slim.max_pool2d(C1, [2, 2], stride=[2, 2], padding='VALID')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:10:16.678485Z",
     "start_time": "2018-06-01T06:10:16.671472Z"
    }
   },
   "source": [
    "接下来，我们定义第二个卷积层，使用16个5X5的卷积核对输入数据进行卷积，\n",
    "padding方式还是选择valid，输出8x8,深度为16，本层卷积的激活函数为relu。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.805912Z",
     "start_time": "2018-06-01T06:32:51.776959Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('conv2'):\n",
    "    C3 = tf.contrib.slim.conv2d(\n",
    "        S2, 16, [5, 5], padding='VALID', activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "再进行一次stride为2的最大池化，输出为4x4,深度16。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.814748Z",
     "start_time": "2018-06-01T06:32:51.807560Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('pool2'):\n",
    "    S4 = tf.contrib.slim.max_pool2d(C3, [2, 2], stride=[2, 2], padding='VALID')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "池化后的数据是3维的，这里做一个拉平的操作，将3维数据展开到1维，然后送入两层全连接，全连接隐层中神经元个数分别为120，84。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.856740Z",
     "start_time": "2018-06-01T06:32:51.817287Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('fc1'):\n",
    "    S4_flat = tf.contrib.slim.flatten(S4)     #全连接前将数据拉平\n",
    "    C5 = tf.contrib.slim.fully_connected(\n",
    "        S4_flat, 120, activation_fn=tf.nn.relu)\n",
    "\n",
    "with tf.name_scope('fc2'):\n",
    "    F6 = tf.contrib.slim.fully_connected(C5, 84, activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:17:39.880958Z",
     "start_time": "2018-06-01T06:17:39.869797Z"
    }
   },
   "source": [
    "###### 对特征添加一个0.6的dropout，以40%的概率丢弃特征中的某些数据，\n",
    "这样可以提高网络的推广能力，减少过拟合的可能性。\n",
    "\n",
    "需要注意的是，dropout仅在训练的时候使用，验证的时候，需要关闭dropout，\n",
    "所以验证时候的keep_prob是1.0。\n",
    "\n",
    "dropout的输出最终送入一个隐层为10的全连接层，这个全连接层即为最后的分类器。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.913419Z",
     "start_time": "2018-06-01T06:32:51.860766Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('dropout'):\n",
    "    keep_prob = tf.placeholder(name='keep_prob', dtype=tf.float32)\n",
    "    F6_drop = tf.nn.dropout(F6, keep_prob)\n",
    "\n",
    "with tf.name_scope('fc3'):\n",
    "    logits = tf.contrib.slim.fully_connected(F6_drop, 10, activation_fn=None)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来定义loss和用于优化网络的优化器。loss计算使用了sparse_softmax_cross_entropy_with_logits,\n",
    "这样做的好处是labels可以不用手动做one_hot省了一些麻烦。这里使用了sgd优化器，学习率为0.3。\n",
    "\n",
    ">试试看，增大减小学习率，换个优化器再进行训练会发生什么。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:52.084738Z",
     "start_time": "2018-06-01T06:32:51.915376Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-12-3c77ec77605a>:2: softmax_cross_entropy_with_logits (from tensorflow.python.ops.nn_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "\n",
      "Future major versions of TensorFlow will allow gradients to flow\n",
      "into the labels input on backprop by default.\n",
      "\n",
      "See @{tf.nn.softmax_cross_entropy_with_logits_v2}.\n",
      "\n",
      "Conv/weights:0\n",
      "INFO:tensorflow:Summary name Conv/weights:0 is illegal; using Conv/weights_0 instead.\n",
      "Conv/biases:0\n",
      "INFO:tensorflow:Summary name Conv/biases:0 is illegal; using Conv/biases_0 instead.\n",
      "Conv_1/weights:0\n",
      "INFO:tensorflow:Summary name Conv_1/weights:0 is illegal; using Conv_1/weights_0 instead.\n",
      "Conv_1/biases:0\n",
      "INFO:tensorflow:Summary name Conv_1/biases:0 is illegal; using Conv_1/biases_0 instead.\n",
      "fully_connected/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected/weights:0 is illegal; using fully_connected/weights_0 instead.\n",
      "fully_connected/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected/biases:0 is illegal; using fully_connected/biases_0 instead.\n",
      "fully_connected_1/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected_1/weights:0 is illegal; using fully_connected_1/weights_0 instead.\n",
      "fully_connected_1/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected_1/biases:0 is illegal; using fully_connected_1/biases_0 instead.\n",
      "fully_connected_2/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected_2/weights:0 is illegal; using fully_connected_2/weights_0 instead.\n",
      "fully_connected_2/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected_2/biases:0 is illegal; using fully_connected_2/biases_0 instead.\n"
     ]
    }
   ],
   "source": [
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y))\n",
    "\n",
    "l2_loss = tf.add_n([    #sum\n",
    "    tf.nn.l2_loss(w)\n",
    "    for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)   #取权重参数\n",
    "])\n",
    "\n",
    "for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES):\n",
    "    print(w.name)\n",
    "    tf.summary.histogram(w.name, w)\n",
    "    \n",
    "total_loss = cross_entropy_loss + 7e-5 * l2_loss\n",
    "tf.summary.scalar('cross_entropy_loss', cross_entropy_loss)    #打印\n",
    "tf.summary.scalar('l2_loss', l2_loss)\n",
    "tf.summary.scalar('total_loss', total_loss)\n",
    "\n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=0.3).minimize(total_loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:25:56.449132Z",
     "start_time": "2018-06-01T06:25:56.438340Z"
    }
   },
   "source": [
    "需要注意的是，上面的网络，最后输出的是未经softmax的原始logits，而不是概率分布，\n",
    "要想看到概率分布，还需要做一下softmax。\n",
    "\n",
    "将输出的结果与正确结果进行对比，即可得到我们的网络输出结果的准确率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:39:50.010829Z",
     "start_time": "2018-06-01T06:39:49.997501Z"
    }
   },
   "outputs": [],
   "source": [
    "pred = tf.nn.softmax(logits)\n",
    "correct_pred = tf.equal(tf.argmax(y, 1), tf.argmax(logits, 1))\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "saver用于保存或恢复训练的模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:52.127795Z",
     "start_time": "2018-06-01T06:32:52.103115Z"
    }
   },
   "outputs": [],
   "source": [
    "batch_size = 100\n",
    "trainig_step = 1100     #100*1100=110000/5500=2epoch\n",
    "\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以上定义的所有操作，均为计算图，也就是仅仅是定义了网络的结构，实际需要运行的话，还需要创建一个session，并将数据填入网络中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:35:22.270272Z",
     "start_time": "2018-06-01T06:33:18.829198Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.218862, the validation accuracy is 0.9194\n",
      "after 200 training steps, the loss is 0.257455, the validation accuracy is 0.9584\n",
      "after 300 training steps, the loss is 0.188239, the validation accuracy is 0.9606\n",
      "after 400 training steps, the loss is 0.0925393, the validation accuracy is 0.9702\n",
      "after 500 training steps, the loss is 0.0976658, the validation accuracy is 0.9746\n",
      "after 600 training steps, the loss is 0.121981, the validation accuracy is 0.9732\n",
      "after 700 training steps, the loss is 0.118653, the validation accuracy is 0.9772\n",
      "after 800 training steps, the loss is 0.13858, the validation accuracy is 0.9784\n",
      "after 900 training steps, the loss is 0.150774, the validation accuracy is 0.9772\n",
      "after 1000 training steps, the loss is 0.0407662, the validation accuracy is 0.9824\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.979\n"
     ]
    }
   ],
   "source": [
    "merged = tf.summary.merge_all()  #可以将所有summary全部保存到磁盘,以便tensorboard显示\n",
    "with tf.Session() as sess:\n",
    "\n",
    "    writer = tf.summary.FileWriter(\"logs/\", sess.graph)\n",
    "\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "        keep_prob: 1.0\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels, keep_prob: 1.0}\n",
    "\n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss, rs = sess.run(\n",
    "            [optimizer, cross_entropy_loss, merged],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                keep_prob: 0.6\n",
    "            })\n",
    "        writer.add_summary(rs, i)\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:58:16.766415Z",
     "start_time": "2018-06-01T06:58:15.918700Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-1000\n",
      "1.0\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeEAAAHiCAYAAADf3nSgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3XeYFMXWBvD3bGAJS86Slhx1VRADKqAoJhQDhosB41XkYrjiNaBiDt81Z1TELCpmrxhAFESygGQUEMkSlswCu+f7o3u7u4bpZXJveH/Ps8+enqqpqZ6anpqu6iCqCiIiIkq9tKArQEREVF6xEyYiIgoIO2EiIqKAsBMmIiIKCDthIiKigLATJiIiCgg7YSIiooCUuk5YRIaJyF4R2S4iVSJ8zh8iskdE3i4mj4rIDhF5MHG1TT0RGSciu0VkYtB1iRTbtHilrU3ZnsUrbe0JACIy0m6f5RHmb2O3f4GIXOWTp4eIFNr5TklohVNIRLLsddgrIg9E+/xAOmG7wt6/AhF5NooiRqlqtqrusMv7OqS8PSLyW1FmVW0J4KEIys1V1Ts99RwuIovsD8qAMOtxk4isFZEtIjJCRLI8aTki8oOI7BSRhSLSy+9F7UYcISJb7fJu9qQ1EZHJIrJJRB4Ped4YEenifUxVTwBwbQTrmjB2/V8TkT9FZJuI/Coip0ZZTGibDhGRuXZ5y0RkiDcz2zS5RGSQiEwXkXwRGRlDEaHt2dN+77aE+yJneyafiNQSkU/E+iHzp4j8I8oiHlPVHE95vu+Jqi5W1WwAEw5Q5mr7czLGLrOhiHwuIqvF+tGV481c3Gva6SfabbnTbttmfi9cXPvb5SwTkTUicoHn8RoiMlNEqnrWNd9e13cOsK5hBdIJ2296tl3x+gB2AfgwjvJODSlzUjzlecwGMBDAzNAEEekN4DYAJwLIAdACwL2eLO8B+BVAbQB3AvhIROr6vM4wAK0BNAPQE8Ct4v4yvB3AGwCaA+hbtEHbH4ylqjo99tVLmAwAfwHoDqA6gLsAfBC6AUVJAFwKoCaAUwAMEpEL46smALZppFYDeADAiASVt8Mua8iBMkaJ7Rm55wHsgfWd2x/AiyLSMY7yhsH/PYlVIYAxAM6N9jVFpA6Aj2F9/9QCMB3AqGJeq7j2fwpAH1jfPS+KSLr9+MMAHlHVbbGsXFiqGugfgMsALAUgEeYfBuDtYtJzABQAaB7l8xRAK5+0iQAGhDz2LoCHPMsnAlhrx20A5AOo6kmfAOBan/JXATjZs3w/gPft+GsAbe34fQDnA6gG68NTw6e8AQAmBtyucwCcm4g2tfM8A+BZtmnK2/EBACOjfI5vuwDoBWB5LJ8Dtmdc7VgFVgfcxvPYW7A6lEiePxLAA5G+J57HxgO4yqfMHgBW+qRl2O2dE0U7XANgUsg67wLQLkz5xbY/rB9PRY+vBVAPQFcAY6J5jyL5KwlzwpcBeFPttQAAEckTkWNjLO9SABNUdVlCauevI6xf4UVmA6gvIrXttKVq/lqabT9uEJGaAA4KU1ZR3rkAThKRGgC6AJgP64P3lKrmJWhdEkpE6sP6kM/zPBZzm4qIADjOW16SsE0jFOc2mipsT1cbAAWqutjzmLMOItLUbtOmkRQWwXuScBG8ptHeak2F/OFTpwO1/3oRyRWRXFh755th7R0PTsCqGALthO0G7w5rKMehqjVUNdaDFi6F9Ysk2bIBbPEsF8VVw6QVpVfF/rJDnh+a92FYHdCPsIaTMgEcAuALEXlXRH4SkUGxrkSiiUgmrLmRN1R1YdHjcbbpMFif1dfjr2Gx2KYRirM9U4Xt6Sp2fVV1hd2mK6Ior6iM/cpLkgO9ZrRtWlzeawE8DWA4gEsAXAdgLICKIvKNPZfcPZaVCJWRiELicCmsIZmE7LXav8wbAPjoAPm+hrXRAMA/VTWWCfXtsIacihTF28KkFaWHm0fY7knfHZpXVTcBuMCudxqAn2B9QG6D9Qt8AICZIjJOVefHsB4JY9fvLVjDXgn50rG/vC4FcJyq5heTj21ahrA9Ey6a9Y20vKIy9ntPwhGR7Z7FDkl4zWjb1Devqs6CNVwOEWkI4HEAR8P6oXUjrGMmfhKRZt5R3FgEPRx9KUL2guN0GYCPVXV7cZnUPJArpiPaYA2N5nqWcwGsU9WNdloL7xF0dvp+w6mquhnAmjBlhRt6vQbAZFWdC+BgANNVdQ+A3wB0inE9EsIeMn4N1kEf56rq3gSUeQXsA2tUdWVxedmmZQvbM+EWA8gQkdaex/zW4YCifE+KnpPt+Yt0jzua1zTaW6zT41r61Cni9gfwJIChqroLbpsuhzXi4XcgX8QC64RF5BgAjZCYo5ghIpUA9EMCh6JFpIKIVIR1pG6miFS0f+kCwJsArhSRDvZcxdCi17bnXWYBuMd+ztmwhqdG+7zUmwCGikhNEWkH4OrQ9RCRegCuhzU0CwDLAPQUkWxY81BLE7DK8XgRQHsAfewPa1xEpD+sU1ZOUtWErRvbNDIikmG/T+kA0u11jnnkTETS7PIyrUWpKCIVElBPtmcE7PnRjwHcJyJVRKQbgLNgjVzF6oDvSSzs9iw6lSzLXo7kNT8B0ElEzrWfczeAOd5psSKRtr+InASgoqp+aT+0DMAJYh1VngVgY7zrm5Ij83yOJHsZwFs+adthDT+GSxuGMEdQArgIwJ/wOcra73me9P2OvIR1ZJ+G/PXwpN8MYB2ArbDmK7M8aTn283cBWASglyetP4B5nuUsWKdvbLXLuzlM/d4E0M+z3ATAFFgHDDwekncAUnvkZTP7vdltt13RX/9Y2xTWh31vSHkvsU1T1qbDwrxPw+Jozx5hyhvP9kxNe9qvWQvAp7BOF1sB4B+etKZ2mzb1ee5I7H90dCTvyXhEeXR0mPbUSF8T1tH3C+02HQ/P0dUAXoLnO6S49ve81iwAzTyPnQhgOaw98gsP9B5F1C6p/BAk6IM01P4Q5QGoEuFzFtkfsBHF5NkNa2L+/qDXMc735ztY8xpjg64L27R8tinbs2y1p13nV+z2+SPC/K3t9t+JkFPHPHmOtzvAPAC9g17HON6bLHsddgC4J9rni10IERERpVjQB2YRERGVW+yEiYiIAsJOmIiIKCApvVjHSWn9OAEdkO8KP5REl8n2DE4y2hNgmwaJ22jZEml7ck+YiIgoIOyEiYiIAsJOmIiIKCDshImIiALCTpiIiCgg7ISJiIgCwk6YiIgoIOyEiYiIApLSi3UQJcPyB4524oKK5rUJ6nb824l/yfW7VSzQctzlTlx1aiUjrf4zk+KtIhFRWNwTJiIiCgg7YSIiooCwEyYiIgoI54SpVNr8VWsnnnvocxE9Z28xl7Jf2PNVJ36nS0Mj7YPvujtxwYIlEdaQShLp3NFY/urzt5z44JcGOXGT+zn/n2rpNao78aLnWjixd5sEgKHrOzvxb/3bGGkF8xcnqXbJxz1hIiKigLATJiIiCgiHo6lU8A4/A8DPh74f0fNeynOHt5745SQnzmn2t5Hv2w4fO3H/qmuMtAcH1HHiFv/hcHRptP6IasbyPhQ4ceXVvOVukAqbN3bi33q87MSh00cP1JvhxLlnH2OkNeFwNBEREUWLnTAREVFAOBxNJda+E92jIcflPh+SmulET212j5T84YIuZrbV652wzebpTpxWsaKR7aEpBzvxHXV+M+tRc1/EdaaSafMhBcbyyn35Tlz7tV9SXZ1yLaNJY2O5+fDfA6pJycA9YSIiooCwEyYiIgoIO2EiIqKAlOo54Y1XH20sN73EnVtYuL6+kbYn351DbPSeG1deud3IVzhrfiKrSHHY3qiCE6eF/F70zgOPP9Odzy1Yuiiisn+/9zBj+d1aj3uWsoy0xmP4W7U00m6HOvGEM54w0rr/9C8nboVfU1an8mrF3e4pRZ1PMb9jH2s4Ieryso8xTzH86y63/Dpz3GM4Kn02NeqyU43fLkRERAFhJ0xERBSQUj0cfeuQd43lc6tsdhdaFvPEHm64fN9OI+npv3vGX7EITV3fzImrPF7dSMsYOyM0e7lT40331JHzpl9spMnmrU68b83yqMu+6rTvjeXstCyfnFRabepQyYkbplc20hp9lBmanZJozj+fdeK9WlBMzsiMz33HfCDXDT/Z4d6AZcS2vka2jHEl73uVe8JEREQBYSdMREQUEHbCREREASnVc8LP3HGhsXz3Ie5vipoLzFtwbG4vTlzhkDwnfqzTx0a+JxtOceKvdmY78emVzVOZirNL9zjxlPwqTtyj4l4zo+e1Wl3wTyOpzdiIX65cSMRNu5c/6J7SdmWN/4akupex/Peao4yUqt8vcOsRdy0oVU4c6B5T8OmOGkZa9nj3VDa2aXJkjnfnZjMlPe7yft1T6MTL99Y10s6ussmJz892L1V7/lvDjXxnNOqMkoZ7wkRERAFhJ0xERBSQUj0cXeWjKSHL/nmr+Tz+bIMexvID3XLc5/zoXoHrsR6tIq5Xxi532KTKHPcG8bV/Gm3kO7iC58pdy3nKRDLkXeIOQf98qTsEXT3NvIvSL/nucNmsB8yraVXaWvKvukNAese2xvJD9d5z4te2mnfuKcjbkpI6lSe7+nY1li9v+KETe09LivQUpU5jrzWW6451TyPM2mKWcXsPd3/yt37P+Ja58nb3ylqNH54UUT2SjXvCREREAWEnTEREFJBSPRydCPvWrjOWq4x2l70DHlU+2hhT+euucodDO1Yw3+7/bnKHz3JeX2rWK6ZXo1AbDnePkg8dgva6bPxVTtzmUw4/l0arTqrtmzZjW7OQR3YltzLlhHcK4IEnzCORu1TY483pW4b3CldDfzjXidvfutDIV7B1K/y0XeLe0GXqme523jVrt5Hv6+sec+KTK95qpOU85F5NS/PzfV8r0bgnTEREFBB2wkRERAFhJ0xERBSQcj8nnAwZzZo48XN3POfEoVeN+fDpXk5ce80voPjt+c6c+/ul3eOeJXeuKPeXy4x87f/9hxPzCkql09YOe33TZj13qLFcA9zeEqHQc5yLOQfs74o/TzGWt13g3u2qzUr3eIxotkPvFfUGjnRPbZr+z6eMfA3T3deaeaWZdu7H7neCzl6AVOGeMBERUUDYCRMREQWEw9FJsPCmRk58RJZ744h5e8zTImrN35myOpVlGS1ynPj+Vh8aaTU9pyXN8Jx10Ox+c7CrYPPmpNSNkiv/1COc+LOTnzXS7tvgXqy/1ug5RlohKJXuWNfFibdeZZ5KVrBySUJfK2f0Bie+q695M5ZHGkxL6GslAveEiYiIAsJOmIiIKCAcjk6A/NOPMJZnnvekZ8m96Ph1N9xg5Ks0iVdmSoSWH6xy4sMq+P+uvMhzQfg2s0vesBRFb+UJ7lfYIRXMK6JdtvxgJ663w7z6EiVecfcMnnO49/7uiR1+3o+4U4AZaebEQ3F1XH2vGzfom/Ba+eKeMBERUUDYCRMREQWEnTAREVFAOCecACtONX/LZIs7D3zRspOcuPKY2UY+BcVq82Xu3anure+9KlaWke+y5e5Vydrf+rsT86pYZUPdTuuduEDN+b+Mz2qmujrlzqLrKjvxXi0ZW9Xyc9xToD6qax53s1fTPbFZ34PuceNUnsLGPWEiIqKAsBMmIiIKCIejY5RWtaoTX3LcRCNta6F7I+n1D7Vw4qx8nhYTq4xGBxnLxw2e4sTZaVmh2R2/zG/lxG028/0vCzKauzfp+G9b9wppr2xpYuSrNYI3aUi2ocd9EcjrZjRpbCxv6+x+P7x0+QsRlTE13zylTfbsi79iMeCeMBERUUDYCRMREQWEnTAREVFAOCccoyXDOjrxl3XMOYizlpzrxFn/4zxkIiy4w5zv+7RB+Lmonr/1M5Z5WlLZs+Sf7vzfUZ7DAa6e2dPI1wRzU1UlSrH59zYwlued/FxEzxu9vY4Tv3iL+V1RcUEwlxHmnjAREVFA2AkTEREFhMPREdpysXlz6DkXPOPEf+zba6Rtf9Q9fD4La5JbsXJixplPhjwS/rSk6gPNa93s27w5STWioBQ22R328V15FcM+TmVD5viGTvxww9ExlTFy1TFOXPGLknEXO+4JExERBYSdMBERUUA4HF0M71WabrxrlJGWJe5bd+HsS4y0ul/ziOig7K1f3VjO3NMo6jIK/t5gLGt+vhNLljsMnl63DvwU1K1hLC/5d4WIXlsL3BuSt/vX70ZawdatEZVR1r1w5NthH2/0tf8N2yk50sWd/skU//d/6z+O8k27977XnLhnpfBTDaHl73+ziMjaXk9YFVG+VOKeMBERUUDYCRMREQWEnTAREVFAOCccQjLctyT3y5VO3C97o5HvnW31nLj+XeZvmVTeEJpMX300Iu4yjvn1ImN5w7pqTlyz7jYnntL53bhfqzgdhg4yllvcWj7vCrS7T1dj+diK3lNL+BUWpEdGnefE51/5lG++n/7veSfefz4XnrTIXre4Mrw6jb3WWG6NmZG9QApxT5iIiCgg7ISJiIgCwrGcULltnfD+em/5Znv+Iffi3zVml89hwlQ6a35/Y3lsp4+S9lqTDnsvpuft1D1OvFf9JyVOmzPAibfM8j/NqdHEYG4yXtKsONMco/SeHnjfhoOdOPuzGUa+CEc2KQ4tRrmn80292LxiWdcs/9ON4jU133yt4Wu7O/Hmge7NHdotCznNL2k1ih33hImIiALCTpiIiCgg7ISJiIgCUu7nhNM7tDGWr3n/s7D5Ooy43ljOeWty0upE+6vUe5mx3PEh9/QdjfBTXLXdJieO5vSijhMud19rRRXffC0+2u4uTP3NN19NLAkbkyu9mnta2H+6/c8337tfH+/ELfbx2IxUK5i/2InvvvkqI+2vPu5xEYtPfTmhrztwhHnqUZMHJ3mWSted07gnTEREFBB2wkRERAEp98PRCwfWNJb7VA5/p5rG4/eYDyhPgAhS8zviG3o8A50jfy3Mieu1KHqFnjtXzd95kJHWa1UXJ2790DwnLomnn5QnlT6baiy38czsHX+RO52XOWCdkW9MR/cOdSfPvdCJC0fWM/Kpe4Mx5Mz620grzW3PPWEiIqKAsBMmIiIKSLkcjvZeEH5sn8dDUiuntjJEtB/1DEcv6mKmVcCfTlyahyHLk2rvec4mCbkg3dlwv4+rYKknZSn8lKV2554wERFRQNgJExERBYSdMBERUUDK5Zzw6m7pTtw0w38O+J1t7iHymVvNU5R4ghIREcWLe8JEREQBYSdMREQUkHI5HF2chzd2cOJfeuc4sa7xvyA/ERFRLLgnTEREFBB2wkRERAFhJ0xERBSQcjkn3OI29w48p912eDE51ya/MkREVG5xT5iIiCgg7ISJiIgCIsqb0xMREQWCe8JEREQBYSdMREQUEHbCREREAWEnTEREFJBS1wmLyEgR2SMiyyPM30ZEtotIgYhc5ZOnh4gU2vlOSWiFU0hEsux12CsiDwRdn0iJyDC7zttFpEqEz/nD/hy8XUweFZEdIvJg4mqbeiIyTkR2i8jEoOsSCW6j/krrNurF7TWy9YlUoJ2wiLS2v1yiXZHHVDUnTHm1RORv75eVqi5W1WwAEw5Q5mpVzVbVMXZZDUXkcxFZbX84jNezN6YRIrJVRNaKyM0h6SeKyEIR2SkiP4hIM78XFpEcO89O+zm9QspZJiJrROQCz+M1RGSmiFT1rGu+va7vHGBdE05EBonIdBHJF5GRMRQxyn7/d9jl9bTfky3hvsxVtSWAhyIoN1dV7/TUc7iILLK/0AeEWY+b7PbcYrdvlifNt53ClOP7+RCRJiIyWUQ2icjjIc8bIyJdQtb1BADXRrCuCcdt1Mlb6rdRLxFpL9aPuy0i8ruInB1lEaHbaw0ReUNE1tt/w7yZ49he+4jIXLvDnyQiHTxpWSLypN3+m0XkBRHJLGadT7DbY6uILBWRazxpuSIyT0Q2iMhNnsczRWSKiDSJcX0OKOg94ecBTEtgeY8CWJCgsgoBjAFwrk/6MACtATQD0BPArWL/QheROgA+BnAXgFoApgMYVcxrvQfgVwC1AdwJ4CMRqWunPQWgD4BTALwoIun24w8DeERVt8WyckmwGsADAEYkqLwddllDElRekdkABgKYGZogIr0B3AbgRAA5AFoAuNeTpbh2CjUMPp8PALcDeANAcwB9izpd+wt8qapOj331Eo7bqKUsbKMAABHJAPAZgC9hrfs1AN4WkTZxFPskgMqwtpuuAC4RkcvjrGdrWD9WrgVQA8AXAD636w9Y22oXAJ0AtAFwOIChPmVlAvgEwMsAqgO4AMATIpJrZ3kYwC0AcgEMFZEG9uM3Axitqn/Fsy7FCawTFpELAeQBGJug8o6G1RivJ6I8VV2nqi/A/wvoUgD3q+pmVV0A4BUAA+y0cwDMU9UPVXU3rC+DXBFpF6beRR+ee1R1l6qOBvAb3C+WKqo6V1VnA9gDoLaIdAXQXFU/SMS6JoKqfqyqnwLYmKDypqrqWwCWJqI8T7nPq+pYALvDJF8G4DVVnaeqmwHcD7tNI2inUMV9PpoDGKeqW2B9vlqISDVYXyp3JGA1E4LbqFPvMrGNerQDcBCAJ1W1QFXHAfgZwCVxlNkH1ujHTlVdDuA1AFfEWc/eACao6kRV3QfrB1wjAN09r/mMqm5S1b8BPFPMa9YCUA3AW2qZBuvHYNGeddE2uQrAEgBNRaQprDZ+Ms71KFYgnbD9hXMfgH+HSWsqInn2GxBpeemwfrEPApD0q4+ISE1YH+LZnodnA+hoxx29afaQzR+edK+OsPZ+vL+WvWWtt4dKcmH98t8M65f34ASsSsrYbXps0PU4AKPd7Li+iNTGgdvJEcHnYy6Ak0SkBqxf8vNhdfhPqWpegtYlLtxGDWVtGxWfxzo5C7FtrxISd/LLGEV5oWV6yw2X3lhEqocWpKrrYI1mXC4i6fYPwmYAiqZF5gI4WUQaw9qb/wNWp36rqu6Ncz2KFdSe8P2w9jj228VX1RWqWkNVV0RR3mAAU1R1RsJqWLxs+/8Wz2NbAFT1pG+ByZseWlZxea8F8DSA4bB+qV4Ha8+kooh8Y89TdUcJZ7dpST+wKLQtiuKqYdKK0v3a1Pv80LwPAzgOwI+wOqZMAIcA+EJE3hWRn0RkUKwrkSDcRs2yytI2uhDAegBD7DnPk2HtXVYuyhDD9joGwG0iUlVEWsHaI618gOccyHcAuot1UF4FWKNEFTzlfg3gBhGpaw8fF/3o8Xvd9wDcDSAf1vEHd3o+37fAarfPAdwEoBuAbQCWishnIvKjiPSLc33CSvldlETkUAC9AByWoPIOgvXmd47iOds9ix18M/oren41uMOa1WA1WlF6tZDneNNDy/LNq6qzAPSw690QwOMAjob1BX4jrLnYn0SkmZbja5CKyNewOjYA+KeqxnLgS2hbFMXbwqQVpfu1aVH6fp8PVd0Ea04KIpIG4CdYX+S3wfpFPgDATBEZp6rzY1iPuHAbDVtWmdlGVXWviPQF8CyA/8CaD/8AVucUq8F2eUtgTUm9B+Aiv8yRbK+qulBELgPwHICGAN6GNWq00s7yIKy54ll23V+B9ZldH+b12sGa8z8bVufeGsCXIrJaVb9S1T8BnGbnrQxgEqzh8Gft530FYK6IjLW334QJYk+4B6zd/RUishbWL5BzRWS/A2Ui1BVWA823y3saQFexjoZMD/cE+6i+or9ofs0XPX8zgDWwJvGL5AKYZ8fzvGliHcbf0pPuNQ/WnKD3F3iuT94nAQxV1V0ADgYw3Z5/yQTgd4BQuaCqp3raNNYjT412s+N1qroRUbRTBJ8Pr2sATFbVuXDbdA+sOcd4h/Ni1QPcRr3K3DaqqnNUtbuq1lbV3rAOQpwaR3mbVLW/qjZQ1Y6w+hbf8iLdXlX1I1XtpKq1AdwDawh5mp22S1UHqWojVW0Bq/OfoaoFYYrqBGCRqn6jqoWqughWx3pqmLx3A3jVHsIuasMtsDr/VhG8HVEJohMeDuvDfqj99xKsN6N3jOV9DesLo6i8u2EdxXioT2NETEQqAig6RSXLXi7yJqyj6Grav7KuBjDSTvsEQCcROdd+zt0A5qjqwtDXUNXFsH7J3SMiFcU6VeAQAKND6nISgIqq+qX90DIAJ4hIR7uOCTkgKlYikmGvazqAdHtdYh5pEZE0u7xMa1Eq2kNS8dazgl2uAMi0yy3aDt4EcKWIdLDnFIfCbtNI28mjuM9HUV3qAbge1kFBgNWmPUUkG9ZccUIPSosCt1GPsrKNeonIIfa6VBaRW2D9SBoZR3ktRaS2Pd96Kqwfl3GfBy0ine0y68I6svmLojYSkUYicpBYjoJ1pPs9PkX9CqC1WKcpiYi0BHAGzGMGINYpUD0AvGg/VNSG9WHtPUf9g/CAVDXQP1hfQG97lpvCGv5p6pN/JIAHiilvAICJYR4fD+Aqn+f0ALAyzOMa+udJy4J1Cs1WAOsA3Bzy3F6w5l522a+d40l7CcBLnuUcO88uAIsA9AopKwvWl0Azz2MnAlgO69f+hdG8R0lsx9D3a5gnfTuA4yL5DHjaJLS88Qd6Xpj2axXmcxBabg9P+s12e26FdRRvViTtBKA/rKNtI/p82HneBNDPs9wEwBRYB/Y8HsnnOoVty220lG+jIa//f/bnbDusH0mh20m02+v5sIbdd9rvQ+9InhemLUPrMRHWsP8mWJ1wFU/a8fb7u9Nuk/4hz/0awB0hdZxrl7cS1tHWaSHP+QHAkZ7lXFhD4BvCfH6KXZ+I2yKoD0EcH55X7A/IHxHmbw3rNIudAAb45Dne3rjywn14Ssuf/UWQB+sc23uCrk8U9R5q1znPu5Ed4DmL7M/BiGLy7IZ1AM39Qa9jnO/Pd/YXx9ig6xJhfbmN+q9rqdxGQ9ah3G+vkaxPpH+8nzAREVFAgr5iFhERUbnFTpiIiCggKT1P+KS0fhz7Dsh3hR+Gu0pOXNiewUlGewJs0yBxGy1bIm1P7gkTEREFhJ0wERFRQNgJExERBYSdMBERUUDYCRMREQWEnTAREVFA2AkTEREFhJ0wERFRQNgJExERBYSdMBERUUDYCRMREQWEnTAREVFA2AkTEREFhJ0wERFRQNgJExERBYSdMBERUUAygq4fC0l9AAAgAElEQVRAEAp6Hu7Eg4Z/YKS92LpV0l532wVHGcs1Zm1w67To96S9LkUn79KjjeUpj7zoxB2eH+jETR+dauTTffuSW7EyLqNZEyeuNyrPiX+c0cHI1+4FN61g3qLkV8yWXreusbzxVPe7ouaomU6s+fkpqxOVftwTJiIiCgg7YSIiooCUy+HoP3tnOXGt9O0pe921p+8xlvde4v4GqnVGyqpBYWQ0OsiJ77/7Vd98869/wYlPfeY4I023bUt8xcqwjAb1jeX7xo924raZhU58wsYGRr6CeUuSWzEP7xB0/4kzjbSjKn7ixNf/9k834dd5Sa9XaZZep7axvOjJpk7co7Xbtqu67zXyldVhfu4JExERBYSdMBERUUDYCRMREQWk3MwJS2YFJz7hhFmB1KHqrxWN5fOv/NGJf6jR2EgryNuSkjqRZX3vZk58cuW9vvkOn36BE9fdvjipdSqLMho3cuLqo3YaaYdUSHfitt9f68StLzPnYlNpwQM5Tnx+9hgj7fCnbnXig36dlKoqlUrrBx3jxPfc8KaRdnrlb8M+p2+dPsbyvlWrE1+xEoB7wkRERAFhJ0xERBSQcjMcve1s9ypZzzR61onbfzrIyNcaU5JWh/yaaiwPrrnQicdXbW9m5nB0UqVVrmws9x48MaLnZb1f011Q9c9IYW3u5l4V69Oc533ztR+63olTeR0yPTrXWP79jJeduPtv/Yy0JiPc7bcgudUqldLbtHTiV//9lBMfWsHsdgoR3poXqxrLDf/pnqq2b83a+CtYQnBPmIiIKCDshImIiALCTpiIiCggZXZOWLsdaiw//+jTTvz2Vvd0lHZDzdNMkjm3c/TJc5NYOkUj/xhzDv6Beq/55t1Z6F5utNq7k5NWp7LIe2ckAPj7rN2+ebv8919O3OCv1J3y450HHvrOG775tn9lXj6zysalSatTWbDgNvf4Ce/pZ5Ga0vldY3nxL+52eM5bNxtpLR781YkLd/t/xkoi7gkTEREFhJ0wERFRQMrscPTm282r8TTOcE90uPlfpztx5uYZSa1HRkN3COv1puYVd/YqfwMFZdk5kQ+Pnbekr2epbF61J1n+ejrbWF7SdaQTD11vThk1et29+1AqT/lZ1aOKE3fLMk+Y6TTpMidu+iyvilWc9A5tjOXvT3zKs1TJiR7daE4FTc9z76I0qqX5HenVxnPVw1f6v2ikPTriLCcuXPZnRPUtKdgLEBERBYSdMBERUUDK1HD0xquPduIPD/4/I+3NLYc4ceb3yR2C9pp/n3t06F41B9kuW97LiQvW/52yOhFw+hGzfdO2FO4ylvcOc28+n8bh6KioirHs3QambMwx0tJ3rUeypFU1r7606MEOTvzpmU84cSEyjXxN+/2WtDqVNRu61jaWczLcq9Jd89fxTrzyqO1GvrQq7tRh52vdI+RvufoDI1//qu7n43jzXjj4YvQKJ55/eum6shb3hImIiALCTpiIiCgg7ISJiIgCUqbmhNP6bnDigzKyjLTX3j3FiRsjuacapHds68Rvn+jehSVfzZvFr3jCPaS/Sn7y7t5ElvzTjnDi5xq94ptvZchte9J+/DV8RorL/9p9aixfOb6nE6/Y1tCJ97xmXqkqUmuPc+9yddqRs4y0zw96wbPkzgN3m3Whka8mlsT02uVRgfmVi0K47/+clw924lr4xcy3Y4cTN3zc/W7+oM8RRr6Lqn7pLqh5Ktm6fHfOX3fnR17pEoB7wkRERAFhJ0xERBSQUj0cnV63rrE8tM1XvnkbP5S6q90sHFjDibtkuadkPL+5g5GvymgOQafSuiMyD5wJQJ8vbzSWW4PtFKt6z1Yyln8Y7p5b0rOSeaH915r+4MRpcE9tKnxCEQujDPiX8d429xS02ndEdsN52l/Vc9f4pm3p7Q4513o9svLubvZ5yCP++4wTfm3nxG02T43sBUoI7gkTEREFhJ0wERFRQEr1cLRUNi+b0rvyFifuOu1SI60BFqSkTgBQJ2dT2MffWdbFzIfFYfNRclQ4bLNv2oI97lV72j2zwUhL5c0EypqMcebV6Z4+9gQnvv+YHCNt5cnukPHvfV5y4qn55lW3Lv722oheu/Wb7lGyX304wjffY/N7O3Gj2fN881Hxto1uaD7Q0Q0HdHCndH46oquR7e/D3Jt86Bnud2enTHNYecFe9+ySjp6bOQDAJ6c+68T/OepqN2HynANXPGDcEyYiIgoIO2EiIqKAsBMmIiIKSKmeEy7clGcs3//34U78j5bTjbSfGrZ04kTfWSOjWRNj+edD3/csub9zdk2uE/JMzgkn2+4z3Pmn6Ud4bwSebuRbtLeeExcs/iPZ1Sq39q1d58SVP15npLX52I1Pu/Zw+GmDyE5BSTvEPW3Fe7oSADywoZMTN7vBPZYk5GJpFIUGny8zlhffvseJh9Se78T/+dQ8Psfv9LEL/jjdWN412D0l9ez3xhtpl1f7y4n/GOx+57acfIBKlwDcEyYiIgoIO2EiIqKAlO7h6G3bjOVvV7nDTxMOfddIW/NldTft5aOjfq28DuaQSXaOO4R11EHLzXr5XGdHYrvwD8VhVx132DlT0n3z3TrjHCdujpJ/WgMd2Ip73PYOHfL89kH3JvPZf5WCMctSIHSa75oh7pXnXv/vE07cJrOK+UTPzRhafeueXtRu0EIjW+EOd0j7kXF9jLQr+7pTTY92cec1Xs01h7QLZ6fuVNVIcU+YiIgoIOyEiYiIAsJOmIiIKCClek44VM173ctYdh92kZH2SaeRTvzoPeZNpSMxPd+cTyzw/H7pUmFPSG5BOE2f/c1Y5h1aki+/b17Yx72XqQSAxq9GdoclKrk2XGMe6zHnqOedePm+XUZapb9Dt1lKtOwP3UtVXo6bnXjT+ea2t3tLlhO3H+KeHliwYwf8tL1tvrF8Ymv3mI7vOo524nvuMfczG52DEod7wkRERAFhJ0xERBSQMjUcjanucG/108ykS3oMduK81lmIVu1X/IewV33c0VieceTIsPlCT6mixEtv09JYnn7E295UJ/p6eycjX+b35t1+qPTZedJ237TzZl1lLNf7YWayq0Me3qHp7A/980V6x7LQ79Ktn3i2Z8/X8aOHjDbyvdCwhxMn+sqJseKeMBERUUDYCRMREQWkbA1HFyN9vDv8VHt8Ysvetbyq+cCR4fNpt0ONZfl5VmIrQljXs56x7HeVrOd+OMlYbo0pYfNR6fFy57eM5TUF7lG4tZ+qnOrqUArVfdm9qceRp/7Diad0Nq+ceMMtOU7c8t8cjiYiIirX2AkTEREFhJ0wERFRQMrNnHBShVwgK83ntw3ngJNvd63wVysDgBn57lWS2j+60kjjzdxLp5W3H+PE3bLM044m57vzwOk8JalsK3RPbqr9uNvuG94yr5S24EL3Kmp93r3USNMZ85JUueJxT5iIiCgg7ISJiIgCwuHoRDDvF45C3pohMPVOWOWb9vnWw5y44O8NqagOJVn/i8Y6cWHIhnjl9AFO3AzmzVPSa9dyF+rVdsKCBUsSW0FKubQff3XiHm8MMdLmX+EOR2970ByqrtbPPdU0lVc35J4wERFRQNgJExERBYSdMBERUUA4J5wAhRX954D/LshPYU3KJ8ly74p11kGzffNt3JPtxJrPdinrCgvcfYz1g44x0k6/aoITf7q0oROXxJu+U+xaDf/LWH6rXwMn/ungj4y0U3KvcOK0iak7nZR7wkRERAFhJ0xERBQQDkcnwNunvGQsL9jjDk9fNPJWJ26KSSmrU7lS4F4tZ/iCY42kG49Z7sTj/2rlxI0QzNVxKHUWHP+6Exceb56+1PEnd+ix1bAdThzpTeWpdNj3l3llvA/O7u7El3w/ykjbMGS3E9ebmNx6eXFPmIiIKCDshImIiALC4egEuG/ZmcbyjhcaOXHT0RyCTjbd595+Iee2HUZa+4cvcWKZVRVUtnxzpzu8OP/2hkbaL1PaOXG7p1cbaS3XLnLigt27QeWD94poFyw92Uj74rBXnfjKowa6CZPnJLVO3BMmIiIKCDthIiKigLATJiIiCgjnhBPhRPMw+CpY6ZORkq3g92XGctN+AVWEUqLiF1Od+O8vzLRWmOzE+0Bk2nm2edralEkHOfHmtlWcuOZkJBX3hImIiALCTpiIiCggHI4mIqJyp2DDRmN5eJsWTlwTv6SsHtwTJiIiCgg7YSIiooCwEyYiIgoIO2EiIqKAsBMmIiIKCDthIiKigIiqHjgXERERJRz3hImIiALCTpiIiCgg7ISJiIgCUuo7YREZKSJ7RGR5hPnbiMh2ESkQkat88vQQkUI73ykJrXCCiUgvu56FItIr6PrEQkSGicheez2qHPgZgIj8Ybf728XkURHZISIPJq62qSci40Rkt4hMDLoukSjv22RxRCTLXoe9IvJA0PWJFLfR4sWzjZaITlhExtsrsN3+WxRlEY+pao6nvKIvge2ev3QAUNXFqpoNYMIBylytqtmqOsYuU0TkThFZISJbReR9Eanmec1GIvKZiGwSkZUicm0x63ugsoaIyAYRmSsinTyPdxORT71lqer39vqsiOytSg4RaW9/ELeIyO8icnaURYyy3+8ddnk1ROQNEVlv/w3zZlbVlgAeiqDcXFW901PP4SKyyP5CHxBmPW4SkbX2eowQkSxPWo6I/CAiO0VkYXE/euwv2xF2+64VkZs9aU1EZLL9WXk85HljRKRLyLqeAMD385QMIlJLRD6xvyD/FJF/RFlE6Dbp+37EsU02FJHPRWS1/WWe481c3Gva6Sfa7bjTbtdmfi9cXNvb5SwTkTUicoHn8RoiMlNEqnrWNd9e13cOsK5JISIXisgCu13/EJHjoni6sY3a5R0uIj/Z37HrROSGojRuo5EpEZ2wbZDdwNmq2jYB5T3mKS9bVQviLO9SAJcA6AbgIACVADzrSX8bwDIA9QGcDuAhEekZbVki0hDAlQBaAHgJwCP24xkAHgdwY5zrkXB23T4D8CWAWgCuAfC2iLSJo9gnAVQGkAOgK4BLROTyOKsKALMBDAQwMzRBRHoDuA3AifbrtgBwryfLewB+BVAbwJ0APhKRuj6vMwxAawDNAPQEcKu4e3C3A3gDQHMAfYs2aPsLfKmqTo999RLmeQB7YH2e+wN4UUQ6xlHeMPi/H7EqBDAGwLnRvqaI1AHwMYC7YH1mpwMYVcxrFdf2TwHoA+AUWO9Tuv34wwAeUdVtsaxcoonISQAeBXA5gKoAjgewNI7y6sB6/1+G9b60AvBt/DUtX9toSeqES7o+AF5T1b9UdTusD/MFIlJZRLIB9ADwoKruVdXZAD4CcEW0ZQFoCuBXVd0K4HtYHzLA6nw/V9XlSVq/eLSD9WPiSVUtUNVxAH6G9UMjVn1g/ZDaaa/za/B/PyOmqs+r6lgAu8MkXwarXeap6mYA9wMYAFhDpgAOB3CPqu5S1dEAfoN/B3ApgPtVdbOqLgDwSlFZsDbscaq6BcA0AC3EGgm5DcAd8a5jvMQabjwXwF2qul1VJwL4HPG1Z3HvR0xUdZ2qvgDrPYz2Nc8BME9VP1TV3bC+kHNFpF1oIRG0fRVVnWtv93sA1BaRrgCaq+oH8axjgt0L4D5Vnayqhaq6SlVXxVHezQC+UdV37D38bfb7HJfyto2WpE74YbGGYH8WkR5FD4pIUxHJE5GmUZY30B5KmCEifo0QDbH/vMtZsH5Jiecxb3onhFdcWb8DOFhEagDoBWCeiDQBcCGA/8a5DskiPo95h9LzROTYOMot7v1MlI6wfoUXmQ2gvojUttOWhuzVzLYfN4hITVg/SkLLKso7F8BJdht3ATAf1pfJU6qal6B1iUcbAAWqutjzmFP/aLfJCN6PhIvgNY22todY//Cp04Hafr2I5IpILqy9882w9o4HJ2BVEsLeO+8CoK5Y00UrReQ5EankyRPtNnoUgE0iMkmsKaMvYviejlaZ20ZLSif8H1h7fI0ADAfwhYi0BABVXaGqNVQ1mjnPZ2B1aPVgDTeNFJFucdbxawBX2XMO1e06A0Blu9F/BnCXiFQUkcNh/fqqHENZGwE8CGAcrGHtWwA8bec5W0R+FGvuuXGc65NICwGsBzBERDJF5GQA3eFZf7sNozloYQyA20Skqoi0grUX7Pd+Jko2gC2e5aK4api0ovSq2F92yPND8z4M4DgAP8Ia9s0EcAisz/279hzboFhXIgGKXdcYtskDvR/JcKDXjLY9i8t7LaxtdDis0YLrAIwFUFFEvrHnKLvHshIJVB/W5+w8WJ+9QwEcBmBoUYYYttHGsPZMb4A1grcM1nBwMpW5bbREdMKqOsUeyshX1TdgdWinxVHeTFXdqKr7VPV/sA6COMcvv5gHcPn9khsB6wM2HsA8AD/Yj6+0//eHNYTxF4AX7ddcifCKLUtV31PVw1X1VFh7f/mw5jn+C2uY9kOUoL1iVd0LoC+sHw1rAfwbwAfwX/9IDAawC8ASWPPN7xVXnoh87WnD/jG+5nYA1TzLRfG2MGlF6eHm+7aHPN/Iq6qbVPUCVc2F9eX9LIB/wRrqmgtrBORaEekQ43rEK5p1jbS8ojIiKi/CbTKe14y2PX3zquosVe2hqkfC2mO6AtYBSa/CGgK+HMBbIhJuxChVdtn/n1XVNaq6AcATiON71i7zE1WdZg/p3wvgGHvHYj/cRsMrEZ1wGIrwQ5xJKS/kAK6wv+7tOZR7VDVHVRvD6jxX2X9Q1T9V9QxVrWtvjLUBTI2lrCL2UNFDsDq11gD+sueKp8H6VVZiqOocVe2uqrVVtTeskY2w6x9heZtUtb+qNlDVjrA+q77lqeqpnjaM9cjTeQByPcu5ANbZoxPzYM0LVQ1JnxemLpsBrAlT1n55YR3ENllV5wI4GMB0Vd0Day4r2cPvfhYDyBCR1p7H/Op/QFG+H0XPOeA2GedrGm1tz4O39KlTxG0P64DCoaq6C257Loe1J+V3gFDS2e/HSljfhYkyJ6S8ojjsdy230fAC74TFOoy/tz2Mm2H/QjoewDdxlHmeiGSLSJo9NHoxrANL4qlnLRFpKZYOsH5F3qeqhXZ6e3votIKIXAzgZDtP1GV5DAUwUlVXwzoFqa2I1Id1JF/MRzUmg4gcYrdhZRG5BUBDACPjKK+liNQWkXQRORXWhhD3eZV2+1SE9UWRade5aDt4E8CVItLBnjMaCnsd7PnRWQDusZ9zNqwfQqN9XupNAENFpKZYB/tcjZD3Q0TqAbge1kFBgDWc11OsA/26IKA2tudHPwZwn4hUsadyzgLwVhzFHvD9iIXdlkWnqGTZy5G85icAOonIufZz7gYwR1UXhr5GpG0v1tHHFVX1S/uhZQBOEOuo8iwAG+Nd3zi9DuBfIlLP/nzfCOuMhnjKO1tEDhWRTFhTfxPjnTMtd9uoqgb6B+vX4TRYwwB5ACYDOMmT3hTW0EFTn+ePBPBAyGMTYI3vb4U12X5hmOeNB3CVT5k9AKwMeawNgEUAdgL4E8DNIek3AvgbwA4AEwF0CUnfDuC4SMqy87S135cMz2NDAGyANeR1cEj+5QB6BdiO/wfrgJTtsOa8W/mtf5jnDgPwdshj5wNYbb9HswD0juR5Iekaph7j7ce9fz086TcDWGd/dl4HkOVJy7Gfv8tuv16etP6wjrYtWs6CNe2w1S4vXBu/CaCfZ7kJgCn2+/h4SN4BsL7gUtWetQB8an+eVwD4hyctlm0ykvdjPKLYJj1tbPxF+pqwhhQX2u05HkCOJ+0lAC9F0vae15oFoJnnsRNhbZdrEPIdFO49SkGbZgJ4Adb37FpYx85U9KRHtY3aj18HawRvM4AvADSJ5Hkh7Veut9GUfQCS+MF6xf7w/BFh/tb2h3AngAE+eY63GzEPYb78S9KfvaHn2fXtGXR9YlyHobC+7PNgne4RyXMW2e0+opg8u2H9GLs/6HWM8/35DtaP1LFB1yXC+pbrbfIA65plr8MOWKfSBF6nCOvNbbT4dY15G+WtDImIiAIS+JwwERFRecVOmIiIKCDshImIiAKSkcoXOymtHyegA/Jd4YcJv1AA2zM4yWhPgG0aJG6jZUuk7ck9YSIiooCwEyYiIgoIO2EiIqKAsBMmIiIKCDthIiKigLATJiIiCgg7YSIiooCwEyYiIgpISi/WQURE5U9a5cpO3HnSNiPtnrqznPjk+ec4cYWT/kx+xUoA7gkTEREFhJ0wERFRQNgJExERBYRzwkmQ0aC+E+9pfVBEz8lcvMpYXnR7CyeuMd+9DnitBbuNfGkTfo2likSlxu4+XY3lSl/PdGLt0sGJl51Zxch33Am/OfGEcQf7lt/wlwInrvjF1JjrSSbvPPDi4W2d+NO6w418hZ74r9kNnbglOCdMREREScROmIiIKCAcjo7RlouPcuKNp5lDxLcdNsaJL632v4jKe21LU2P5nKqfOHHNfhV9n3dGo84RlU9U0qXXqe3EBaMqOfH7rZ8w8q0ryHTi6mnjnbhpRmX4uuwn36T1F+904tXPVDDS/vnQDU5c+5Vf/Mun/Sy9M9eJ5/d8xon7Lz3VyLfxweZO3HLM5ORXrIThnjAREVFA2AkTEREFhMPRIdJy2zvxwn+5R1tOOPkpI1/d9GnucxLwW+bK6itCHvEfgiYqixY/7U7JLGr3mifFHGaul+7GL+S1ceKZ28wpnZU7avi+Vrq4x+R+1faLsGUDwKih/+fE1y4YZKSlTZwF8ren3r6wj8+Z0NpYbj6mfA/zc0+YiIgoIOyEiYiIAsJOmIiIKCCcEw6xo3lVJ1586ouelEr7Z47TS3nuVbHe+fOImMqojt8TVZ0yL+1Q9+pKuxuYV1da3te9Ktl5XacZaXvVnSj84S336k0Nf9xi5NNf5yWknuWFHp1rLI865mXPkvvVNGaXOSf8yJDLnLjqvA1uwt+bjHxpm//yf+00t03bPD7Qieef/6yRr2VmthPvGrrVSKs+wL0y3r6163xfq7zKzN7jxNsK3bjpd/lBVKfE4p4wERFRQNgJExERBaTMDkdnNG5kLC/4T2Mnrj/JHXqs9p55hZa0fHXixXvdIZS/9pmnOzTJyHPiAXMvM9I2L3Cv/FN/mltejUnm8Jhu3+7E1fM4rJwI2u1QY3np9W787tGvOHHnCiHnokRqiHuB/1237DGShue5w90vzO5upLW+coETF+42r7BWXu2tbl6d6tAK7tdRIdztZsjrVxj5mnwyyYkLEKNC95mtbnK/A9pXME9DmnPW007848EfGWndernD2NXf5nB0eqvmxvK840c48Q2rT3Tz/TAT5OKeMBERUUDYCRMREQWEnTAREVFAytSccHqN6k7c9atlRtqndT534m7TzXkfr6yv3dNThpw+wIkL5i0yX6u9e+m1Wov+MNJqFS4OW3b4i7hRLAqPded+l7tTc/iq2/NGvpYZ3lPL3Hng73aZp5zdMb+vE+etMOf/5/Z1T1u5a51796zHGkw38uVWcm9C/kTXUUba7TcNcOLGD08CAQUVxTftkEkDnLjpg6l7v1pfP8VY/rKXe5P5ftkbjbS8M3c4cfW3k1uv0mDRMP/LhKZS/qnu6Z7bmvh3cXVnmKec6YxgTjHknjAREVFA2AkTEREFpFQPR6dVNO80lP+ROxx9R51xRlrbj90xy3afuMMOxZ3iEDoEbaQtWBJhLSkRlr5rnnr0ju/pRuYw80XLTnLiaQvdUyja3bDAyFd3h9vWdUNe+9rOvZx4/eBmTnzTi+ZpTkPrj3fiCbsaGmmzBrlD2n3fPsuJ9/21EuVV29v9h//SZ1T1TUulO6e50xT9er5mpF3f8Scn/hI1U1ankurJI0f5pv387uFO3ADxTy/88c5hxvLTR77nxAdXmOjE9dOzfMv4fa85QXjWRzc5cctbJodmTxruCRMREQWEnTAREVFASt1wdHpNd9hn4f1tjLRF7V9w4hkh1whvd99SJy7Yah4VRyVDWhXzpgpL7jvYiRd0N496TvMc6TzNc5Wz/p9db+Rre6877Nwmzz2auRCRO7jqKif+LsMd0p7+f52NfLWfcI+s7VslDyb/I4HLk7RD2jlxjxrfGWmL97pXEqszZ2/K6lScmj96prx6BlePkiq9WjUnrpJmful+u8vdnhs8GdkQtGS6V1Hb0/MQI+3OF1934uMrzjDSMsX9Ppia7w5BX7qwn5Hv5ubfOvGZVXYaaS/0dacbnhpxthMXzA9/tkuicE+YiIgoIOyEiYiIAsJOmIiIKCClbk549cXtnXjR2eYNuD/f4c4Xv3bGSUZawd/mVa2o5Mk782BjeVy//zpxGswbu4/d5c77PDLQvYtVq2/NUwsivcuOZLibQlrblkbaq5/WcuL/e/MNJz64wvqQUtw6pov5+/bgKf9w4kbry+9nccll7lWVLsz+20g7ds4lTlztf9NAJd+yGzs58bEVxxppHX641Ilb4VffMrx3X1p0fX0nnn/+s+GyAwDG7so2lgd+M8CJ2z29wYmzFpvb2vNwjyN6dmwTI+3Ldh878cNN3dNdK8z3rUZCcE+YiIgoIOyEiYiIAlLqhqO3HbnLN+3pZe6NoystLr9DfqWVmhegwm71P61nW6F7Zay1R7qnNew6p6uRr1XrNWGfv2W3ebW1fs3cG41fX+MtI236Hrf8blnek5vMIXKvn3ebJ0E1esBdF83PD81ebtx06ldO7D0lCQAqPF/bs8TttzSQQ/xP98z8o5Jvmpf3xg8Le7qnIoaeRth/6alOvPXWRkZa61/c0wMjnYL6fWkD84F24fMlG/eEiYiIAsJOmIiIKCClbjj6vW7DPUvmb4iPOrg39Tz6iX8bac0/3+PE6eNngkqemp+ZF/S/5tL+Tvx2O/OGrWdWca+Sde517pXSCtT/Wlj56l6wPUuK++ibaeYQtGtfyMBXjzkXOnGt6800XRrMvUpLspc3Hm8sV/xyakA1oVi1q7cu6udI547G8lJy3OQAAB37SURBVCfHvuhZynSijuOvMfK1vtK9+p3snh316x7I3evd+xBXHP+bE0dzdb1YcE+YiIgoIOyEiYiIAsJOmIiIKCClbk64a5Y7Z7BXzXm3mmnuaScLLzDvurP3fDdvp7HXOnH1aeapKtsbu3ON1dwbL6HOnB2+ddpwiHn3n/rj3SspFfBUqYgVbttmLGed7C5fU/8cI23BsBwnPrmzO3+zeEs9I9+fq+o4cXoF9zNwZts5Rr7HGkxHtDr8YM5Ztf23e7elfetCr6ZVPqXXqG4sV01bGVBNKBkaV3bvFpYWuk8ninAWD84ylttnut/pnadd7MQt+5tX2Ur03Gxm9h5jecc+t16Fu3eHZk8a7gkTEREFhJ0wERFRQErdcHTzL6524sVnvBTx87w3fV7U6xU3oVdCqmWYept7daQb53tOWzkjuTeHLssKQoZ321znLi/3PF4Bfxr5WocsF/n2kw7GcnHD0cv3uTf/7vvsrW7ZT5mn1BTs2wcyrbzSPB2lf9UfnHjmjpwU1yZ6+adt8U3bWVjBN628KFR3P64wdMDY54p3DevnGcve53Wo657ytDkB9QvlvVnEvONHGGnHzznfiaul8Ipt3BMmIiIKCDthIiKigLATJiIiCkipmxNue7172HrvD81TRC597gsnrpxm3qnmjMruDcS988PJ0DXLPTR/4mHvOHHH/xts5Gs55Jek1oNMyx462olnHvFkSKr//N55j7nzwAc9P8mJw5+AQaXZvhM6G8vvH/acZ8k8teaTR927tlXH5GRWq0ypcaV5+s+UCe4pSs81db/Dj370FiNfm2fc4zv2rVod02u3H+WWsa7AvCNfxadreZY4J0xERFTmsRMmIiIKSKkbjlbPaSCZ388w0t5rd5Dv8545zz1VqCDTPXT+mFvM00weaTAt3ioavFeRaZwb/gbzlDyrhxzjxN/0f8yJK0ll3+c8vbmVsdzg9VlOnOw7qlDqeYegN91gXhmvXaY7BD1wVTcjrcYo925s5WVqwnuKDwAcX31c1GWEDiU/2quvE+eOdi9TOPfiZ4x8A7v3dOI1p9cy0go2bnLivEvcaadjb5xi5Lu7/s9O3Pl9c7i75ZhgphS4J0xERBQQdsJEREQBKXXD0bGq8tGUsI9/kXu0sfzIJe5w9E51L/Dd+afrjHzNXnWPsN4weKeRNv0I8wb0lDp7T+5iLH86yB2CbprhPwS9wnNVrM//c6KRlrUzsVMU5Um15eZNVrxXHwuSZLhffXk3uTcKmX74+0a+73ZVcuLFd5lX/6qwN/qbfpR2Bb8vM5bfX9vVic9uOcZIa3bsCidOr1bNLWPrViPfvqXLnXjGYe5+4fGXmGeT1JrjXmlL6uw10pY918SJ5x3vHtEeegS0dwi65S0l44h27gkTEREFhJ0wERFRQNgJExERBaTczAn7afqNeWUtXOKGlcW9itKC7q+Z2Zqd5MT/y/kmpNTwv21WrDUPq29t3P+HEmH5GebV0HJ85oHXFJhzk5fe+G8nrvxV+OMHKHpVRpvv5Zj72ztxy4p/G2lLGndy4n0rV8X92oXHHurEywaaaee2d087e6ieOQ/s9dAtlzlxpW+m+uYrr3Zf5c71PjG6nZH2ZbvPnPiGse7pXVNfMo/DyV4d/u5jfx9hnhB4xGD39KXHD5popHlPBR2+JceJR/73DCNfyxEl7yqF3BMmIiIKCDthIiKigJT74ejM6UuM5aNmXuTEkw9/z/d5b+V851kyf8vkq3v4/Bnz3St1tRtsXhTcPHmDYpVe2x3m//Wcp0JSsxBOj4mDjOWWn3AIOtUG1jBPd1n3pTu0OX1T07jLf6T5cCc+tIL/V92MPe6WeMnUK420luMWOjG31/0VLHa/0346yzyFq+ZX7tXHnjxogptw3wT48Q4rF0ZxfbpOEy934lY3b3DiWqtK3vBzKO4JExERBYSdMBERUUDYCRMREQWk3M8JF27bZiw3+FdNJ+4z4kwnviPnKyPf0VnuDNHo7XWMtDv/d4ETt7rJvTQa55QSJ72m2043TnHnmLIl/BwwADy60T09pvXV5rEAvDtSanhPGVl/w09G2r11Z7sL3jhm7tfbvpCtb7Z7RVpcPMq9PGLz28w5RG6zkfNefhIAPu3hnnL2zOXunZJ2NDcvOfnNKe5xHL2/udFNKObWVG1f3W0s50yb49YjksqWINwTJiIiCgg7YSIiooCU++HoUPuWu3f+wAluOHiwecmdbUe4d+doN3SDkdbqz5Jxd46ybMOZ7tV5Tq78gxMXFDOE9b97ezhxlR08JSkItTxXLJr2Uxsj7YlP3SHGm2ua0wWxaPfjFU5c4TfzymmNH57kxM1R8k9jKY0K1q134kaPrPfN9y+4V9Nqg8juWFbMZl7qcE+YiIgoIOyEiYiIAsLh6AjVf2aSueyJS9vReGXBubd878QF6n9sc6svrnXiNqM5BF2ShN4g/vtOVd0Yh8ddfgvMOnAmooBxT5iIiCgg7ISJiIgCwk6YiIgoIJwTplIpt5J7Klm6uL8lJ+82r3HU4TH31AjO3RNRScM9YSIiooCwEyYiIgoIh6OpVLrxHffm6wuvfsGJrxjxLyNfk6XmqWVERCUJ94SJiIgCwk6YiIgoIOyEiYiIAsI5YSqVmt3jzvX2vudQJ24CzgETUenBPWEiIqKAsBMmIiIKiKiWpdsjExERlR7cEyYiIgoIO2EiIqKAsBMmIiIKCDthIiKigJS6TlhEhonIXhHZLiJVInzOHyKyR0TeLiaPisgOEXkwcbVNPREZJyK7RWRi0HWJlIiMtNtneYT529jtXyAiV/nk6SEihXa+UxJa4RQSkSx7HfaKyANB1ycS3EaLx23UycNtFAF1wiLS3v4gbhGR30Xk7CiLGKWq2aq6wy6vhoi8ISLr7b9h3syq2hLAQxGUm6uqd3rqOVxEFtkflAFh1uMmEVlrr8cIEcnypOWIyA8islNEFopIL78XtRtxhIhstcu72ZPWREQmi8gmEXk85HljRKRLyLqeAODaCNY1oUSkloh8Yn9J/iki/4iyiMdUNcdTnu97oqqLVTUbwIQDlLna/pyMsctsKCKfi8hq+ws9x5u5uNe000+023Kn3bbN/F64uPa3y1kmImtE5ALP4zVEZKaIVPWsa769ru8cYF0TSkQGich0EckXkZExFBG6jfa0348t4b7IuY0mn4iMtzv/7fbfoiiLCN1Gizrm7Z6/dIDbaDRS3gmLSAaAzwB8CaAWgGsAvC0ibeIo9kkAlQHkAOgK4BIRuTzOqgLAbAADAcwMTRCR3gBuA3Ci/botANzryfIegF8B1AZwJ4CPRKSuz+sMA9AaQDMAPQHcKu4vw9sBvAGgOYC+RRu0/cFYqqrTY1+9hHoewB4A9QH0B/CiiHSMo7xh8H9PYlUIYAyAc6N9TRGpA+BjAHfB+txOBzCqmNcqrv2fAtAHwCmw3qd0+/GHATyiqttiWbkEWw3gAQAjElTeDrusIQkqrwi30egMsju9bFVtm4DyHvOUl62qBXGWV+620SD2hNsBOAjAk6paoKrjAPwM4JI4yuwD68OwU1WXA3gNwBXxVlRVn1fVsQB2h0m+DMBrqjpPVTcDuB/AAMAaigFwOIB7VHWXqo4G8Bv8P1iXArhfVTer6gIArxSVBWvDHqeqWwBMA9BCRKrB+nK5I951TASxhhzPBXCXqm5X1YkAPkd8bVrcexITVV2nqi/Aeh+jfc1zAMxT1Q9VdTesL4NcEWkXWkgE7V9FVeeq6mxYP1xqi0hXAM1V9YN41jFRVPVjVf0UwMYElTdVVd8CsDQR5XnK5TZahpTHbTSITlh8HuvkLIjkicixcZRrlJckHWH9Ci8yG0B9Ealtpy0N+bU0237cICI1Yf0oCS2rKO9cACeJSA0AXQDMh/Vl8pSq5iVoXeLVBkCBqi72POasg4g0tdu0aSSFRfCeJFwEr2m0tz3M+odPnQ7U/utFJFdEcmH98t8M65f34ASsSkrEuI2mGrfR/T0sIhtE5GcR6VH0YLTbqMdAexh+hoj4/YBJiLK6jQbRCS8EsB7AEBHJFJGTAXSHNZwMAFDVGvbeVKTGALhNRKqKSCtYe8GVD/CceGUD2OJZLoqrhkkrSq+K/WWHPD8078MAjgPwI6wh30wAhwD4QkTeFZGfRGRQrCuRIMWur6qusNt0RRTlFZWxX3lJcqDXjLZNi8t7LYCnAQyHNVpwHYCxACqKyDf2PFX3WFYiVWLYRoPAbdT0H1hD8o1gffa+EJGWQEzbKAA8A2touB6sIeCRItItwXX2KpPbaMrvoqSqe0WkL4BnYX0opgP4AEB+HMUOtstbAmv47D0AF/llFpGvYW00APBPVY1lQn07gGqe5aJ4W5i0ovRw8wjbPem7Q/Oq6iYAF/x/e3cfHVVxN3D8N3khIaBI0gIihPD+/iaigAUj4gNyNMJTaEWoxYqUPjxqRamtUoloj/Z4WhVEsQhUrBakGhBPVaxAtQ8EBHmTtxZIUCgCRUN4Ewh7nz92mXtn3V12k92dkHw/5+Sc32Rm787u3buzd+bOnUC9U0TkI/F/QH4p/l/gY0XkU6XUcsdxtlXidcRDLK832u2d38a33pNQlFLHPclOCXjOWPdp2LKO42wUkfxAvS8Xkd+JSF/xf4n/XPzjsR8ppVo4tfS+shyj8ec4zhpP8hWl1CgRGSr+787KbM87Dv9XpdRr4u8S/r9Q5TlGQ7NydbTjOJsdx7nOcZwcx3EGi//X2doqbO8rx3FGO47TxHGczuJ/XWG35zjOTZ4LCSp71elWEenuSXcXkYOO4xwJ5LXyXkEXyN8aoi5fi8iBENv6VlnxX8RW7DjOZyLSVUTWOY5zRvxjGYnufo/knyKSppRq6/lfuNdwQTG+J+cf4704JJZf89E+p7G/A+PgrcPUKer9L/6LCqc4jnNK3H1aKv6zqXAXCdV4HKNJ4Ujo4cGEbI9jNDRbU5S6KaUylVJZSqkHReRyEfljFbbXWimVo5RKVUrdJP4DocpzKpVSdZRSmeL/YKUH6nz+PZsvIncppToFxiqmSOA1BMZGN4rI1MBjhou/e+rNME81X0SmKKUaBi4iuFuC3g+lVCMRmSj+iw1EREpE5HqlVH3xj0PF9YKXWATGXt4SkWlKqXqBLqlbReTVKmz2gu9JZQT25/lpKhmBdDTPWSQiXZRS3w885lER2ew4zo7g54h2/yulbhSRTMdx3gn8q0REBir/VeUZEqeLoipDKZUWeJ2pIpIaeB2V7jlTSqUEtpfuT6pMpVSdONSTYzQKyj+1ZvD5/aiUGi0iA0Tk/Spsc4RSqn5g3/6XiIwR/wWZVa1r7TpGHcdJ+p+IPC3+ge7jIvKuiLQJyj8uIv3DPLZQRP4U9L8fiL974GTgjR0czeOC8p0Q9VgZ+L/3L9+TP0lEDopIuYjME5EMT15e4PGnRGSniAzy5I0W/1V859MZ4p++UR7Y3qQQ9ZsvIiM96eYisibwPv4uqOxYEflHkvdptogsFv9UlM9F5HZPXm5gn+aGeewfReSJoP9F856sFJFxYbaZLyL7wuxn4y/a5xSRQeK/puFU4LnzPHmzRGRWNPvf81wbRaSF5383iEip+H/t33ah9yjB+7MwxHtV6MmP9RjND7G9lRd6XIh9xzFauf35XfFfcXxMRMpEpFhEbvTkV+YY/Vj846jl4r+o6bYQj1spHKOR902yPgRx/DBNEf8XfZn4LyOP5jE7Ax+wuRHKfBP4QD1u+zVW8f35IHCgfWi7LjHUeXZg/+yOsnzbwP4/KSJjw5QZEDi4yiTEj7KL5S/wRVAW+MxPtV2fKOvMMRr5tXKMOhyj5/9YTxgAAEsuuntHAwBQU9AIAwBgSVLnCd+YMpK+b0s+8C2K51QEEWF/2pSI/SnCPrWJY7RmiXZ/ciYMAIAlNMIAAFhCIwwAgCU0wgAAWEIjDACAJTTCAABYQiMMAIAlNMIAAFhCIwwAgCU0wgAAWEIjDACAJTTCAABYQiMMAIAlSV1FCQDiadczfXS8+4ezjLw79g7Q8cG+5UmrE2JTMbCXjkuGu03SAzf81Sg3vkGpjlPEXKDIJ+5iUVMP9dTx0tIuRrmmT6a6ibVbKlXfeONMGAAAS2iEAQCwhO5o1GhpTRrr+Oi1eTref6O51nlJwR90fNY5Z+Rdu/E2HR/+oqGOOz31pVGuovTzKtUVsbu2z7awefNbfKTj/sN/auRlFa1JWJ1qq/0P9TPSJ9qe0fGoXmvDPu6xRu6x5xOfjlOCzhG9eR1XjjfyGr2doeNLFhbruKmE/3xUF5wJAwBgCY0wAACW0B2Ni57KcLui9jx2pZH3/IiXdXxd3ZNht3HWcX+Peru9REQ+7vG6m+jhCXN+YpTLHRlVdRFH3i7nSP49wLyatk1RImpTu22693kj7b1i+eC5Uzp+4YjZbd3uXXeooN6/6ug48z/mkFHOnNU6bi0bqlbZaoQzYQAALKERBgDAEhphAAAsYUw4yLl8d0wx7dGDOl7a/m2jXLpy77wSaUpLziPpOlal+41yR27ppOPsxZ8Zeb5jx2Kpdq32+WT3jjtbfvRcpbZx594bdDynxQdRPWZjv7lGukB6V+q5kXht7i++cCFUyYAtI4z08q4LdewdB17f0zz3ayfrEluxao4zYQAALKERBgDAklrZHe2d0nKsoIeRN/VJt4vRO6XFnLQictZz9XykKS1X/nqsjrs3MX/zLMlzL+nvfdk9Rl7jGatCVx4iIuL07a7juT+ZEfPju82710i3fPxTHXd4ZqKRt+PWmTFvH6htLrv7jJF+58McHQ+7bL2ON3a83Sh3bvu/Eluxao4zYQAALKERBgDAEhphAAAsqZVjwqfzu+p4+bPPhy234lR9HT/6hHmLwvSTTnBxrbyF+9umjudOib940JzSctRXoeP6B8xpTjB5x4BFRJwnvtJxL3eI/1tj90XHG+l47tgCHeetMVd1cXzu+9/+/k1G3k2Lf6bjx2e5K75clWHus0GfudPK/tblkuCXgARovXCCjnf/cFbYcrue6WOkmbIUfxVf7DPSvywareNtY9zv2TNNzGMjdXti61XdcSYMAIAlNMIAAFhSa7qjvd2ZT774Uthyo3YP1XH51OY6brhidajiITVo01LHPRbt1nHHOuZvng5L7tdxu7+wyHgkh3rXM9KfdHC79r13LzvqM6dJTH3DvXtZ3uro9qFz+rSRTl/m3tFnzPtu9+fWW8yhjMnZ7r6e/ecfG3ktR5ld3IiPSF3QsMyzcFWKJ3Gkc6ZRLFv1kmhkrHOnMp0rL69a3aoRzoQBALCERhgAAEtqTXf014+4i0p7r6YduuO/jXKpD17qxhs+lcoo69VYx1MbvRG2XPNlldp8rZQy6IiR9t6lzHv3sjv3FBjl8n4d/TBCNNr9zL2qesb3Oht5k7J36Hh0p0+MvFVSR4CaLK15MyP91LDXdOwT9yAt/pW5yEqK51zQe1ynBJ0j5m8ZqePTi8xjL2dOfI/zZOJMGAAAS2iEAQCwhEYYAABLauyYcMmCbkZ6a895Ot5X4Y4PpzzS0CjnbNgc83N5V2USEWnz823u9j2/c7wLx4uI1F1s3rUJprQrmur4gfZ/i+oxexa1NdKN5XBc6+Q1d8kgIz3pzh1hSgI1k3cceOj75jS8gnpf63jqoZ46XlraxSjnFF8WctsFt/3DSE9q5X4HDJtWZuT5prljzkN+NF7H3mlNItVzahNnwgAAWEIjDACAJTW2O/qOTmZXr/fS970V7jQkKY69+1nE7ILe+ay5uMCSXHcReO+CAnufbm+UyxLukhXJ19/L1fGI+kvClhv/Rb6Or/DcoUxEpELs6FLXvJn92lYDdVyxpzTJtQES43gPd8hofAPzGB2w+Qc6vvQm97hsKtskGut/a54jbmrWX8dTxrUw8voM2aLj9151F1mZWdbaKPfune42ZO0WqQ44EwYAwBIaYQAALKmx3dHxltrZ7Erefk8DHe+4ZWZwcc27JvElq0qMPFYQjuzwlerChURk91MddVz3y+pxxfnN9cw7fP3+qiY6rk93dNKxfnBiZC51j7ebl5oLMVwqu4OLV0nFvv06zi3cb+T9u9CNez50j46Dr7B+fKG78Muv7ppg5KUtXx+HWsaOM2EAACyhEQYAwBIaYQAALKmxY8JvlvQw0pNz3MvRe2ac0HH/zd9Etb2rs94y0tfXdR/nCy7s8cCmETpudnBrVM8Fv3NZ4VdU8aoudx5LV6k69q7sBCB5rvjtKh1veq25kXf5+0d1PO3l2Ubefb+ZqONkrsrEmTAAAJbQCAMAYEmN7Y5uMsa8hL1g8XAdv9PBvbOLt5s6Fv09l8H7RpnTUT7u8bqOG83OqtT2IdKtW6mOfRE7/auHs4476exiqC9Q03mnNYmILHp4sI4PFJrT1l6YMl3HP25+n45zC1dJInEmDACAJTTCAABYQiMMAIAlNXZM2HfsmPmPG9z0wOH/o+NDvcL/Dmm43Z1n0uA1c/zg8KundbyjxwIjb87RPB1nbT2gY1sr+iD59lacMdJ1D58JUxJAstRd4k5n3LQ+/PSljXc/p+OCwt4JrRNnwgAAWEIjDACAJTW2OzqSrKI1Os4rqtw2dgx8WcfB01Fm7rxOx02/iG4Ba1x8xg1bFjbv1nmTjXTuisROc6it7tg7QMfzW3wUttyuZ/oYaVZVQvD0pembrtfxhOv2JK0enAkDAGAJjTAAAJbUyu7oykjt3D7oP+4C0MFXwjaenpmEGtV8Jx5tquN181KNvKsy3LtTfb6oq45zR1buDmiV0btuiZFee1rpOO/pTUYe988CqpmruxrJV/vM0fHMstZJqwZnwgAAWEIjDACAJTTCAABYwphwlPZMrRM2b+SGcUa6yYpPE12dWiHl7xt0PPHZ/zXyPnloho4/uOZFHY+9/l6jXGqc90XJgm46vjZzvZHXb8MoHWef+Gdcnxeuk8Ov0fH8Fi9ZrAm89j7Wz0hn/seNG8+oHlP0Uju103H5tBNGXrO0Uzp+b2x/T05irzPhTBgAAEtohAEAsITu6Aicvt11/PY1LwTlutOQ1IcNk1Sj2uvylV8Z6asGjtHxut5/0vG+fHN6WIsVVX/uE993uz/fuMZd+Hv16QyjXPYTTE1Lhpa/2G67Cgg4cldfHW8ZN8PI67jSHaZrbGZVWVrzZkZ67+25Icu1Gmre+erh5n/WcfEpcxrS8EL3LnfZn6yuahWjxpkwAACW0AgDAGAJjTAAAJYwJhzBod71dNwyzRzv866clPaNk7Q61Va+zTuM9BWPuLcRLSrK1vHbY582yg35ziQdt524RsJRvTrr+GDfBkbeSw+4C3x3rOP+bu2wdLxRrl3xWkH8eackiUQ/Lan/xJ/quE0RqyYlWroyby27Pd9daW5Dift9efvqu41yyhMPaLVLxzvLGhnlVnRdpOMUMace+sTx5LlbfKGspVFu1HL3M9Gp8ICRl70veePAXpwJAwBgCY0wAACW0B0dwTffcbs4fEHr4Dz7VScd58y2041Rm53bulPHrwxxF+N+6Q/mfnrv5t/r+I3+vXS84PWBRrmXx7tzKHpmhF/zaMi2ETru8OIxI4+VkpKv9cIJOm5zv9nlnCXhhx8QHzlz3O++ficmGHmHbjkd8jGv9J1jpK/OcL9nvasX+YyOanPKk++IeQfDVkVnQz5XnfW7jHS78nU6rgj5iOTjTBgAAEtohAEAsITu6AjGDAt/u6W5SwbpOE/ojrapYk+pjjNGfdfIm9DzPh2nP/Sljtff85xRrsPSiWG33/Itt6M5Y8VmHfvOnom5rohdVpHZrTy4qIeO2whXPVcXlywoDkqHLjdNroxyi+ZwT2vZEKZceOdifkTycSYMAIAlNMIAAFhCIwwAgCWMCUfwZok79jQ5J7ELOyM+zh0+bKTTl3nSy9ywQHob5dpJdHe74t5oAOKJM2EAACyhEQYAwBK6oyNwPnQXBni4mXkT+cbrLoaL3wEA1RlnwgAAWEIjDACAJTTCAABYwphwBI2nr9LxZ9PNvLpRTmkBACAczoQBALCERhgAAEuU43APIAAAbOBMGAAAS2iEAQCwhEYYAABLaIQBALCERhgAAEtohAEAsIRGGAAAS2iEAQCwhEYYAABLaIQBALCERhgAAEtohAEAsIRGGAAAS2iEAQCwhEYYAABLaIQBALCERhgAAEtohAEAsIRGGAAAS2iEAQCwhEYYAABLaIQBALCERhgAAEv+H165rQQEMEC+AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x247ea228fd0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16],\n",
    "                keep_prob: 1.0\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(\n",
    "                np.argmax(mnist.test.labels[idx]), order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
